package util.pdf;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;  
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;  
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;  
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;  
import com.itextpdf.text.pdf.PdfPTable;  
import com.itextpdf.text.pdf.PdfWriter;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream; 
import java.io.IOException;
import java.net.URL;
import javax.swing.JFileChooser;
import javax.swing.JTable;  

public class ExportarPDF {  
  
    private String titulo;  
    private String[] nameHeaders;  
    private JTable tabla;  
    private Document documento;
    private String rutaArchivo = "";
    private float[] medidasCeldas;
    private boolean continuarIgual = false;
    private Font font1 = FontFactory.getFont("Arial", 6.5F, Font.NORMAL);
    private Font font2 = FontFactory.getFont("Arial", 10F, Font.BOLD);       
    
    public ExportarPDF(){         
        continuarIgual = true;
    }
    
    public ExportarPDF(String reportTitle, String[] headerNames){  
        this.titulo = reportTitle;  
        this.nameHeaders = headerNames;
        }   
  
    public void nuevoDoc(String nombreArchivo) throws Exception {
    	documento = new Document();
    	rutaArchivo = nombreArchivo + ".pdf";    	
    	
    	PdfWriter.getInstance(documento, new FileOutputStream(rutaArchivo));   	
    	    	
        documento.open();       
    }   
   
    public void crearFondoPdf(String nombreArchivo) throws IOException, DocumentException {
        
    	rutaArchivo = nombreArchivo + ".pdf";    	
    	
    	//PdfWriter.getInstance(documento, new FileOutputStream(rutaArchivo));    	
    	
    	documento = new Document(PageSize.A7.rotate());
        PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream(rutaArchivo));
        documento.open();       
        
        PdfContentByte canvas = writer.getDirectContentUnder();        
        
        //String path = System.getProperty("user.dir");    	
       	//URL urlDeLaImagen = ExportarPDF.class.getClassLoader().getResource("img/licencia.jpg");
    	String path = System.getProperty("user.dir")+"/src/img/licencia.jpg";
    	URL urlDeLaImagen = ExportarPDF.class.getClassLoader().getResource("img/licencia.jpg");
    	    	
    	System.out.println(path);
    	System.out.println(urlDeLaImagen);
    	    	
    	Image image = Image.getInstance(urlDeLaImagen);    
        image.scaleAbsolute(PageSize.A7.rotate());
        //image.scaleToFit(350, 350);
        image.setAbsolutePosition(0, 0);        
        canvas.addImage(image);       
    }
    
    public void cerrarDoc(){    	
    	documento.close();
    	//writer.setOpenAction(action);
    }
    
    public void nuevaTabla(JTable jtable, float[] medidas) throws Exception { 
    	
    	if(continuarIgual){
    		tabla = jtable;        
    		medidasCeldas = medidas;
            documento.add(getPdfPTable());
    	}
    	else if(medidas.length==nameHeaders.length){
    		tabla = jtable;        
    		medidasCeldas = medidas;
            documento.add(getPdfPTable());
    	}
    	else {
    		System.out.println("Error en las medidas");
    	}
    }     
      
    public void setTitulo(String reportTitle) throws Exception {
    	this.titulo = reportTitle; 
    }
    
    public void nuevoEspacio() throws Exception {
    	documento.add(new Paragraph(" ", font2));
    }
    
    public void nuevoMiniEspacio() throws Exception { 
    	Paragraph t = new Paragraph(" ", font1);
    	documento.add(t);
    }
    
    public void nuevoTexto(String texto) throws Exception {    	
    	documento.add(new Paragraph(texto, font1));
    }  
    
    public void nuevoTitulo(String texto) throws Exception { 
    	Paragraph t = new Paragraph(texto, font2);    	
    	documento.add(t);
    }       
    
    private PdfPTable getPdfPTable() throws Exception {
    	
    	PdfPTable tab = new PdfPTable(medidasCeldas.length);
    	tab.getDefaultCell().setBorder(0);
    	tab.setWidthPercentage(100);
    	tab.addCell(getCellTitle());
    	    	
    	if(continuarIgual==false){
    	     // PdfPTable tab = new PdfPTable(nameHeaders.length);        
           	  
    	        for (int i = 0; i < nameHeaders.length; i++) {  
    	            tab.addCell(nameHeaders[i]);  
    	        }
    	}    
    	  
        int rowCount = tabla.getRowCount();  
        int collumCount = tabla.getColumnCount();  
        for (int x = 0; x < rowCount; x++) {  
            for (int y = 0; y < collumCount; y++) {  
            	
                tab.addCell(new Phrase(GetData(tabla, x, y).toString(), font1));  
            }  
  
        }  
        
        tab.setWidths(medidasCeldas);
        
        return tab;  
    }   
 
  
    private Object GetData(JTable table, int row_index, int col_index) throws Exception {  
        return table.getModel().getValueAt(row_index, col_index);  
    }  
  
    private PdfPCell getCellTitle() {  
  
        PdfPCell cell = new PdfPCell(new Paragraph(titulo,font1));  
        cell.setColspan(6);  
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);        
        cell.setBackgroundColor(BaseColor.CYAN);
        cell.setBorder(0);
        return cell;  
    }
    
    @SuppressWarnings("unused")
	private PdfPCell getCellTitle2() {  
    	  
        PdfPCell cell = new PdfPCell(new Paragraph(titulo,font1));  
        cell.setColspan(6);  
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);        
        //cell.setBackgroundColor(BaseColor.CYAN);
        cell.setBorder(0);
        return cell;  
    }    
   
    
    
    
    public void borrar(){
    	JFileChooser selector=new JFileChooser();
        selector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        
        File file = new File(rutaArchivo);
        selector.setSelectedFile(file);
        eliminarArchivoDirectorio(selector.getSelectedFile());        
    }
    
    public boolean eliminarArchivoDirectorio(File file) {
    	    	 	
    	  if(file.isDirectory()){
    	    File[] files = file.listFiles();  
    	    for(int i = 0; i < files.length; i++) {  
    	        if(files[i].isDirectory()) {  
    	         this.eliminarArchivoDirectorio(files[i]);  
    	        } else {  
    	         files[i].delete();  
    	        }  
    	     }
    	  }else{
    	   file.delete();
    	  }
    	  return file.delete();  
    	 }     
    
     
    
    public boolean imprimir() {
		   	    	
    	boolean exito = false;
    	
    	String curDir = System.getProperty("user.dir");
    	curDir = curDir+ "\\" + rutaArchivo;
    	
    	File f1 = new File(curDir);
    	Desktop d = Desktop.getDesktop();
    	    	
    	try {
			d.open(f1);
			//d.print(f1);
			
			exito = true;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
 
        return exito;
    }    
           
}

